package com.itheima.mp.controller;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.po.dto.UserFormDTO;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import com.itheima.mp.domain.po.query.UserQuery;

import java.util.List;

@Api(tags = "用户管理")
@Slf4j
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
    private final IUserService userService;

/**
 * 新增用户接口
 * @PostMapping 表示这是一个HTTP POST请求的处理方法
 * @RequestBody 表示将请求体中的JSON数据自动转换为UserFormDTO对象
 * @param dto 接收前端传递的用户表单数据传输对象
 */
    @ApiOperation("新增用户")
    @PostMapping
    public  void save(@RequestBody UserFormDTO dto) {
        //转换
        User user = BeanUtil.copyProperties(dto, User.class);
        userService.save(user);
        log.info("新增用户");
    }

/**
 * 删除用户接口
 * 通过用户ID删除用户信息
 * @param id 用户ID
 */
    @ApiOperation("删除用户")
    @DeleteMapping("/{id}")  // 使用DELETE方法映射，通过URL路径中的id参数进行资源定位
    public void delete(@PathVariable("id") Long id) {  // 方法参数通过@PathVariable从URL路径中获取id值
        userService.removeById(id);  // 调用userService的removeById方法根据id删除用户
        log.info("删除用户");  // 记录删除用户的日志信息
    }

/**
 * 根据ID查询用户信息
 * @ApiOperatio是Swagger的注解，用于API接口方法的说明
 * @GetMapping表示这是一个GET请求，映射到指定的URI模板
 *
 * @param id 用户ID，通过路径变量传递
 * @return 返回UserVO对象，包含用户信息
 */
    @ApiOperation("根据ID查询用户")
    @GetMapping("/{id}")
    public UserVO getById(@PathVariable("id") Long id) {
    // 记录日志，表示正在执行根据ID查询用户的操作
        log.info("根据ID查询用户");
    // 调用userService的getById方法，根据id查询用户实体
//        User user = userService.getById(id);
    // 使用BeanUtil将User实体对象转换为UserVO对象并返回
//        return BeanUtil.copyProperties(user, UserVO.class);

        return userService.queryUserAndAddress(id); // 调用服务层方法查询用户及其地址信息
    }

/**
 * 根据ID批量查询用户信息
 * @return 返回用户视图对象列表
 */
    @ApiOperation("根据ID批量查询")
    @GetMapping
    public List<UserVO> list(@RequestParam("ids") List<Long> ids) {
    // 记录日志：开始根据ID批量查询
        log.info("根据ID批量查询");
    // 调用服务层方法根据ID列表查询用户实体
//        List<User> users = userService.listByIds(ids);
    // 将用户实体列表转换为视图对象列表并返回
//        return BeanUtil.copyToList(users, UserVO.class);

        return userService.queryUserAndAddressList(ids); // 调用服务层方法查询用户及其地址信息列表
    }

/**
 * 根据ID扣减账户余额接口
 * @param id 用户ID
 * @param amount 扣减金额
 */
    @ApiOperation("根据ID扣减账户余额")
    @PutMapping("/{id}/deduction/{amount}")
    public void deduction(@PathVariable("id") Long id, @PathVariable("amount") Integer amount)
    {
        //方法1：
//    // 根据ID查询用户信息
//        User byId = userService.getById(id);
//    // 扣减用户余额（新余额 = 原余额 - 扣减金额）
//        byId.setBalance(byId.getBalance() - amount);
//    // 更新用户信息到数据库
//        userService.updateById(byId);
//    // 记录操作日志
//        log.info("根据ID扣减账户余额");

        //方法2：
        log.info("根据ID扣减账户余额");
        userService.deduction(id, amount);
    }

    /**
     * 根据条件查询用户列表接口
     * @PostMapping("/list") 表示这是一个POST请求，映射到/list路径
     * @param query 包含查询条件的UserQuery对象
     * @return 返回UserVO对象列表
     */
    @ApiOperation("根据条件查询用户列表")
    @PostMapping("/list")
    public List<UserVO> listByCondition(@RequestBody UserQuery query) {
        log.info("根据条件查询用户列表{}", query); // 打印查询条件的日志信息


        // 从查询条件中获取各个查询参数
        String name = query.getName(); // 获取用户名查询条件
        Integer status = query.getStatus(); // 获取状态查询条件
        Integer minBalance = query.getMinBalance(); // 获取最小余额查询条件
        Integer maxBalance = query.getMaxBalance(); // 获取最大余额查询条件
        // 创建查询条件构造器
        QueryWrapper<User> wrapper = new QueryWrapper<>();

        // 注释掉的代码是使用QueryWrapper构建查询条件的另一种方式
//        wrapper.lambda()
//                .like(name != null, User::getUsername, name)
//                .eq(status != null, User::getStatus, status)
//                .ge(minBalance != null, User::getBalance, minBalance)
//                .le(maxBalance != null, User::getBalance, maxBalance);
//        List<User> users = userService.list(wrapper);

        // 使用链式调用方式构建查询条件并执行查询
        List<User> users = userService.lambdaQuery()
                .like(StringUtils.isNotBlank(name), User::getUsername, name) // 当用户名不为空时，添加模糊查询条件
                .eq(status != null, User::getStatus, status) // 当状态不为空时，添加精确查询条件
                .ge(minBalance != null, User::getBalance, minBalance) // 当最小余额不为空时，添加大于等于查询条件
                .le(maxBalance != null, User::getBalance, maxBalance) // 当最大余额不为空时，添加小于等于查询条件
                .list();//最终查询
        return BeanUtil.copyToList(users, UserVO.class);
    }
}

